package tianhao.luo.queue;

/**
 * 使用数组模拟队列
 * 该类有一个缺点:当队列被加满后,再取出数据,再加入数据时,会报错队列已满
 * @author: tianhao.luo@hand-china.com 2021/6/13  15:10
 */
public class ArrayQueue {

    /**
     * 队列容量
     */
    private int maxSize;
    /**
     * 队列元素
     */
    private int[] objects;
    /**
     * 队首指针，指向队首的前一个索引
     * 出队时，应该出去的元素为front+1
     */
    private int front;
    /**
     * 队尾指针，指向队尾的那个元素的索引
     * 入队时，入队的索引位置应该时rear+1
     */
    private int rear;


    public ArrayQueue(int maxSize) {
        this.maxSize = maxSize;
        // 初始化队列大小
        this.objects = new int[maxSize];
        // 队列为空时,将队首指向-1;
        front = -1;
        // 队列为空时,将队尾指向-1;
        rear = -1;
    }

    /**
     * 入队
     * 1.判断对列是否已满
     * 2.未满时,队尾指针后移一位,向队尾插入元素
     * @param i 元素
     */
    public void addQueue(int i){
        if (rear == maxSize-1){
            throw new RuntimeException("队列已满");
        }
        objects[++rear]=i;
    }

    /**
     * 出队
     * 1.判断队列是否为空
     * 2.不为空,队首指针后移一位,取出当前元素
     * @return 队首数据
     */
    public int getQueue(){
        if (rear == front){
            throw new RuntimeException("队列为空");
        }
        return objects[++front];
    }

    /**
     * 展示队首数据
     * @return 队首数据
     */
    public int peek(){
        if (rear == front){
            throw new RuntimeException("队列为空");
        }
        int temp = front+1;
        return objects[temp];
    }

    /**
     * 展示队列中所有元素
     */
    public void showQueue(){
        if (front == rear){
            System.out.println("队列为空");
            return;
        }
        for (int i = front+1; i <= rear; i++) {
            System.out.printf("object[%d]:%d\n",i,objects[i]);
        }
    }
}
